package com.demo.structure.array;

/**
 * 队列：先进先出
 *
 * @author: 蔡奇峰
 * @date: 2020/7/3 17:47
 **/
public class QueueArray {

    /**
     * 数组容量（队列大小）
     */
    private int capacity;
    /**
     * 队头
     */
    private int font;
    /**
     * 队尾
     */
    private int rear;
    /**
     * 队（以数组实现）
     */
    private int[] queue;

    /**
     * 构造器进行初始化
     *
     * @param capacity
     */
    public QueueArray(int capacity) {
        this.capacity = capacity;
        // 头部实际是指向头部的后一位(注意：每次出队或者查看数据时都要加1）
        this.font = -1;
        // 指向尾部
        this.rear = -1;
        // 创建数组
        this.queue = new int[capacity];
    }

    /**
     * 队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return this.rear == this.font;
    }

    /**
     * 是否队满
     *
     * @return
     */
    public boolean isFull() {
        // capacity 是容量 而rear是下标从0开始 即队列入队时下标为1
        return this.capacity == this.rear + 1;
    }

    /**
     * 入队
     *
     * @param node
     * @return
     */
    public int add(int node) {
        if (isFull()) {
            throw new RuntimeException("入队失败！队满了！");
        } else {
            this.rear = this.rear + 1;
            this.queue[this.rear] = node;
            return node;
        }
    }

    /**
     * 出队
     *
     * @return
     */
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空！出队失败！");
        } else {
            this.font = this.font + 1;
            return this.queue[this.font];
        }
    }

    /**
     * 显示队列
     */
    public void displayQueue() {
        int[] queue = this.queue;
        for (int q : queue) {
            System.out.printf("%d\t", q);
        }
        System.out.println();
    }

    /**
     * 显示头部（不是出队）
     */
    public void getHead() {
        System.out.printf("头部数据：%d\t", this.queue[this.font + 1]);
    }
}

/**
 * 测试队列
 */
class Demo {

    public static void main(String[] args) {

        // 创建队列
        QueueArray queue = new QueueArray(3);
        System.out.println("队列是否为空：" + queue.isEmpty());
//        System.out.println("出队：" + queue.pop());
        System.out.println("队列是否队满：" + queue.isFull());

        System.out.println("入队：" + queue.add(6));
        System.out.println("显示队列：");
        queue.displayQueue();

        // 入队
        queue.add(8);
        queue.add(14);
        System.out.println("队列是否队满：" + queue.isFull());
//        System.out.println("入队：" + queue.add(88));
        System.out.println("显示队列：");
        queue.displayQueue();

        // 出队
        System.out.println("出队：" + queue.pop());
        // 显示头部
        queue.getHead();

    }

}
